home *** CD-ROM | disk | FTP | other *** search
- /*
- * AMIGA.C (VEC)
- *
- * Copyright (c) 1993 Ville Saari
- * All rights reserved
- *
- * Created: 07-Apr-93
- * Updated: 04-Dec-93
- */
-
- #include <proto/dos.h>
- #include <proto/exec.h>
- #include <exec/memory.h>
- #include <signal.h>
- #include <string.h>
-
- static struct AnchorPath *ap;
- static int matching, os204;
- static BPTR stderr, origcd;
-
- BPTR openappend(const char *name, int binary)
- {
- BPTR fh;
-
- if(!(fh=Open((char *)name, MODE_READWRITE))) return 0;
-
- Seek(fh, 0, OFFSET_END);
-
- if(IoErr())
- {
- Close(fh);
- return 0;
- }
-
- return fh;
- }
-
- void getfilemode(const char *name, unsigned char *flagbuf, int uu)
- {
- char fibbuf[sizeof(struct FileInfoBlock)+2];
- BPTR lock;
- struct FileInfoBlock *fib;
-
- fib=(struct FileInfoBlock *)(((long)fibbuf+2)&0xfffffffc);
-
- if(lock=Lock((char *)name, ACCESS_READ))
- {
- if(Examine(lock, fib))
- if(uu)
- flagbuf[0]=((fib->fib_Protection>>1)&7^7)+'0';
- else
- {
- flagbuf[2]|=1;
- flagbuf[5]=fib->fib_Protection;
- }
-
- UnLock(lock);
- }
- }
-
- void setfilemode(const char *name, const unsigned char *flags)
- {
- int mode;
-
- switch(flags[2]&0x0f)
- {
- case 1: /* Amiga flags */
- mode=flags[5];
- break;
-
- case 2: /* Unix flags */
- mode=(flags[4]&1)<<3; /* Owner read -> ----r--- */
- if(flags[5]&0x80) mode|=0x05; /* Owner write -> -----w-d */
- if(flags[5]&0x40) mode|=0x40; /* Owner execute -> -s------ */
- mode^=0x0f;
- break;
-
- default:
- mode=0x02; /* ----rw-d */
- }
-
- if(mode) SetProtection((char *)name, mode);
- }
-
- char *basename(const char *name)
- {
- const char *basename;
-
- for(basename=name; *name; name++)
- if(*name==':' || *name=='/') basename=name+1;
-
- return basename;
- }
-
- void init(void)
- {
- signal(SIGINT, SIG_IGN);
-
- if((os204=(DOSBase->dl_lib.lib_Version>=37)) &&
- (ap=(struct AnchorPath *)AllocMem(sizeof *ap+255, MEMF_CLEAR)))
- ap->ap_Strlen=256;
- }
-
- char *firstmatch(const char *pattern)
- {
- int l=strlen(pattern);
-
- if(!ap || l && pattern[l-1]==':') return pattern;
-
- if(DOSBase->dl_Root->rn_Flags&RNF_WILDSTAR && l==1 && *pattern=='*')
- pattern="#?";
-
- if(MatchFirst((char *)pattern, ap))
- {
- MatchEnd(ap);
- return 0;
- }
-
- matching=1;
-
- return (char *)ap->ap_Buf;
- }
-
- char *nextmatch(void)
- {
- if(!ap) return 0;
-
- if(MatchNext(ap))
- {
- matching=0;
- MatchEnd(ap);
- return 0;
- }
-
- return (char *)ap->ap_Buf;
- }
-
- void cleanup(void)
- {
- if(origcd) UnLock(CurrentDir(origcd));
- if(matching) MatchEnd(ap);
- if(ap) FreeMem(ap, sizeof *ap+255);
- if(stderr && stderr!=(BPTR)-1) Close(stderr);
- }
-
- static BPTR stderr=0;
-
- void printerr(const char *string)
- {
- if(!stderr)
- if(!(stderr=Open(os204?"CONSOLE:":"*", MODE_NEWFILE)))
- stderr=(BPTR)-1;
-
- if(stderr!=(BPTR)-1)
- Write(stderr, (void *)string, strlen(string));
- }
-
- int changedir(const char *path)
- {
- BPTR lock, old;
-
- if(!(lock=Lock((char *)path, ACCESS_READ)))
- return 0;
-
- if(!(old=CurrentDir(lock)))
- {
- UnLock(lock);
- return 0;
- }
-
- if(origcd)
- UnLock(old);
- else
- origcd=old;
-
- return 1;
- }
-